#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <vector>
#include <string.h>
#include <string>
int pthread_nums = 5;

using namespace std;

// 任务类
class Task
{
public:
    Task()
    {
    }
    Task(int x, int y)
        : _datax(x), _datay(y)
    {
    }

    int Execut()
    {
        return _datax + _datay;
    }

    void creat_Task(int x, int y)
    {
        _datax = x;
        _datay = y;
    }

private:
    int _datax;
    int _datay;
};

// 线程数据类，内部嵌套了任务类
class pthread_Date
{
public:
    pthread_Date(int x, int y, string pthread_name)
        : _pthreadName(pthread_name)
    {
        _t.creat_Task(x, y);
    }

    int run()
    {
        return _t.Execut();
    }

    string get_pthread_name()
    {
        return _pthreadName;
    }

private:
    Task _t;
    string _pthreadName;
};

class Result
{
public:
    Result() {}
    ~Result() {}

    void setResult(int result, string pthread_name)
    {
        _result = result;
        _pthread_name = pthread_name;
    }

    void print()
    {
        cout << "线程名是： " << _pthread_name << endl;
    }

private:
    string _pthread_name;
    int _result;
};

void *handler(void *args)
{
    pthread_Date *td = static_cast<pthread_Date *>(args);

    // while (1)
    // {
    //     cout << "线程名是 : " << td->get_pthread_name() << endl;
    //     sleep(1);
    // }
    //delet td;
    // return nullptr;
}
// 1. 多线程创建
// 2. 线程传参和返回值，我们可以传递级别信息，也可以传递其他对象(包括你自己定义的！)
int main()
{
    vector<pthread_t> pthread_id_nums;

    for (int i = 0; i < pthread_nums; i++)
    {
        char pthread_name[64];
        snprintf(pthread_name, 64, "pthread-%d", i + 1);
        pthread_Date *pthread_id = new pthread_Date(10, 20, pthread_name);

        pthread_t tid;
        pthread_create(&tid, nullptr, handler, pthread_id); // 向新线程传递线程编号

        pthread_id_nums.push_back(tid);
    }

    // while(1)
    // {
    //     cout<<"I am main pthread"<<endl;
    //     sleep(1);
    // }

    return 0;
}

// // 同一个进程内的线程，大部分资源都是共享的. 地址空间是共享的！
// int g_val = 100;

// std::string ToHex(pthread_t tid)
// {
//     char id[64];
//     snprintf(id, sizeof(id), "0x%lx", tid);
//     return id;
// }
// // 线程退出
// // // 1. 代码跑完，结果对
// // // 2. 代码跑完，结果不对
// // // 3. 出异常了 --- 重点 --- 多线程中，任何一个线程出现异常(div 0， 野指针), 都会导致整个进程退出！ ---- 多线程代码往往健壮性不好

// void *handler(void *args)
// {
//     int cnt = 10;
//     while (cnt)
//     {
//         std::cout << "I am new pthread , pid : " << getpid() << "  g_val : "<<g_val << std::endl;
//         sleep(1);
//         cnt--;

//         // int *p =nullptr;
//         // *p=100;
//     }
//     pthread_exit((void *)1234);
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, handler, nullptr);

//     int cnt = 5;
//     while (1)
//     {
//         g_val++;
//         std::cout << "I am main pthread , pid : " << getpid() << " pthread id : " << ToHex(tid) << "g_val :  "<<g_val<< std::endl;
//         sleep(1);
//         cnt--;
//     }

//     // void *nums;
//     // pthread_join(tid, &nums);
//     // std::cout << "I am main pthread ,is quited" << "exit nums "<< (long long)nums <<std::endl;
//     return 0;
// }